//
//  main.m
//  C11_函数指针
//
//  Created by TravelRound on 15/10/20.
//  Copyright (c) 2015年 TravelRound. All rights reserved.
//

#import <Foundation/Foundation.h>

void test(void)
{
    printf("函数\n");
}

void printHello()
{
    printf("printHello\n");
}

int maxValue(int a, int b)
{
    
    return a > b ? a : b;
    
}

int sum(int a, int b)
{
    
    return a + b;
    
}

//void print(int cont, int (*p)(int a, int b))
//{
//
//    for (int i = 0; i < cont; i++) {
//        printf("循环\n");
//    }
//    int ret = p(3, 5);
//    printf("%d\n", ret);
//
//}



typedef struct student {
    
    char name[20];
    char sex;
    int num;
    float score;
    
} Student;

typedef BOOL (*PFUN)(Student, Student);

BOOL compareNum(Student stu1, Student stu2)
{
    
    return stu1.num > stu2.num ? 1 : 0;
    
}

BOOL compareScore(Student stu1, Student stu2)
{
    
    return stu1.score > stu2.score ? 1 : 0;
    
}

BOOL compareName(Student stu1, Student stu2)
{
    
    return strcmp(stu1.name, stu2.name) > 0 ? 1 : 0;
    
}

void sortStu(Student *stu, int cont, PFUN p)
{
    
    for (int i = 0; i < cont - 1; i++) {
        for (int j = 0; j < cont - i - 1; j++) {
            
            //            if (stu[j].num > stu[j + 1].num) {
            BOOL ret = p(stu[j], stu[j + 1]);
            if (1 == ret) {
                
                Student temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
                
            }
            
        }
    }
    
}

void printStu(Student *stu, int cont)
{
    
    for (int i = 0; i < cont; i++) {
        printf("%s %c %d %.1f\n", stu[i].name, stu[i].sex, stu[i].num, stu[i].score);
    }
    
}

int main(int argc, const char * argv[]) {
    
    //    // 定义一个指向无参无返回值类型函数的指针
    //    void (*p)(void) = NULL;
    //
    //    // 指向一个同类型的函数
    //    p = test;
    //
    //    // 调用指针所指向的函数
    //    p();
    
    
    
    //    void printHello();
    //    定义一个可以指向上述函数的函数指针，
    //    并通过函数指针实现调用该函数。
    
    //    void (*p)() = printHello;
    //    p();
    
    
    //    定义两个函数,一个求最大值,一个求和,
    //    输入maxValue或sum分别求3,5的最大值
    //    或和(提示,定义一个函数指针,根据输入内容指向不同函数
    //    ,最后一次调用完成)。
    
    //    char str[10] = {0};
    //    int (*p)(int a, int b) = NULL;
    //
    //    scanf("%s", str);
    //
    //    if (0 == strcmp(str, "sum")) {
    //        // 指向sum函数
    //        p = sum;
    //    }
    //    if (0 == strcmp(str, "max")) {
    //        // 指向maxValue函数
    //        p = maxValue;
    //    }
    //
    //    // 调用
    //    // p已经根据输入指向对应函数
    //    int ret = p(3, 5);
    //    printf("%d\n", ret);
    
    //    print(3, sum);
    
    Student stu[3] = {
        {"xiaNN", 'm', 3, 99.8},
        {"gaoS", 'm', 2, 88.8},
        {"wangN", 'n', 5, 100}
    };
    
    sortStu(stu, 3, compareScore);
    printStu(stu, 3);
    
    return 0;
    
}